home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac-Source 1994 July
/
Mac-Source_July_1994.iso
/
C and C++
/
Text⁄Files
/
Tape Stuff
/
file.c
< prev
next >
Wrap
Text File
|
1992-11-28
|
7KB
|
281 lines
/* file .c - handles the file activity */
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include "SCSIDefines.h"
#include "pstring.h"
#include "Defines.h"
#include "Prototypes.h"
extern BUFFER *gBufferPtr;
extern Str255 gParentDir;
short WriteEOF(void)
{
char buffer[BLOCKSIZE];
memset(buffer, 0, BLOCKSIZE);
if (BufferWrite(gBufferPtr, buffer, BLOCKSIZE) == ERROR) return ERROR;
return OK;
}
short WriteFile(Str255 name)
{
CInfoPBRec paramBlock; /* parameter block */
OSErr error; /* error status */
FInfo info; /* finder information */
HEADER header; /* file header */
short refNum; /* file path reference number */
char buffer[BLOCKSIZE]; /* data buffer */
long i; /* counter */
long bytesLeft; /* number of bytes in last block */
long count = BLOCKSIZE; /* number of bytes read */
/* get file parameters */
memset(¶mBlock, 0, sizeof(paramBlock));
paramBlock.hFileInfo.ioNamePtr = name;
error = PBGetCatInfo(¶mBlock, FALSE);
if (error != noErr) return ERROR;
/* set up fields of header */
assert(sizeof(HEADER) == BLOCKSIZE);
memset(&header, 0, sizeof(header));
header.name[0] = name[0] - gParentDir[0];
memcpy(&(header.name[1]), &(name[gParentDir[0] + 1]), name[0]);
if ((paramBlock.hFileInfo.ioFlAttrib & IOFADIRECTORY) == 0)
{
header.directory = FALSE;
header.type = paramBlock.hFileInfo.ioFlFndrInfo.fdType;
header.creator = paramBlock.hFileInfo.ioFlFndrInfo.fdCreator;
header.dataLength = paramBlock.hFileInfo.ioFlLgLen;
header.rsrcLength = paramBlock.hFileInfo.ioFlRLgLen;
}
else
{
printf("DIRECTORY!!!\n");
header.directory = TRUE;
}
header.creationDate = paramBlock.hFileInfo.ioFlCrDat;
header.modificationDate = paramBlock.hFileInfo.ioFlMdDat;
header.checksum = Checksum(&header, sizeof(header) - sizeof(header.checksum));
/* write header */
memset(buffer, 0, BLOCKSIZE);
memcpy(buffer, &header, sizeof(header));
if (BufferWrite(gBufferPtr, buffer, BLOCKSIZE) == ERROR) return ERROR;
printf("%s\n", PtoCstr(header.name));
if (header.directory == TRUE) return OK;
/* now write data: shouldn't be any errors so no checking is done! */
/* Resource fork */
if (header.rsrcLength)
{
OpenRF(name, 0, &refNum);
for (i = 0; i < (header.rsrcLength - BLOCKSIZE); i += BLOCKSIZE)
{
FSRead(refNum, &count, buffer);
BufferWrite(gBufferPtr, buffer, BLOCKSIZE);
}
bytesLeft = header.rsrcLength - i;
if (bytesLeft > 0)
{
memset(buffer, 0, BLOCKSIZE);
FSRead(refNum, &bytesLeft, buffer);
BufferWrite(gBufferPtr, buffer, BLOCKSIZE);
}
FSClose(refNum);
}
/* Data fork */
if (header.dataLength)
{
FSOpen(name, 0, &refNum);
for (i = 0; i < (header.dataLength - BLOCKSIZE); i += BLOCKSIZE)
{
FSRead(refNum, &count, buffer);
BufferWrite(gBufferPtr, buffer, BLOCKSIZE);
}
bytesLeft = header.dataLength - i;
if (bytesLeft > 0)
{
memset(buffer, 0, BLOCKSIZE);
FSRead(refNum, &bytesLeft, buffer);
BufferWrite(gBufferPtr, buffer, BLOCKSIZE);
}
FSClose(refNum);
}
return OK;
}
short ReadFile(void)
{
HEADER header; /* file header */
short refNum; /* file path reference number */
char buffer[BLOCKSIZE]; /* data buffer */
long i; /* counter */
long bytesLeft; /* number of bytes in last block */
long count = BLOCKSIZE; /* number of bytes read */
OSErr error; /* error return */
HParamBlockRec pb; /* parameter block */
Str255 name; /* reassembled filename */
/* read header */
if (BufferRead(gBufferPtr, buffer, BLOCKSIZE) == ERROR) return ERROR;
memcpy(&header, buffer, sizeof(header));
/* check checksum */
if (Checksum(&header, sizeof(header) - sizeof(header.checksum)) != header.checksum)
return ERROR;
if (header.checksum == 0) return FILE_END;
Pstrcpy(name, gParentDir);
Pstrcat(name, header.name);
printf("%s\n",PtoCstr(header.name));
if (header.directory == TRUE)
{
memset(&pb, 0, sizeof(pb));
pb.fileParam.ioNamePtr = name;
error = PBDirCreate(&pb, FALSE);
return OK;
}
/* now read data */
error = Create(name, 0, header.creator, header.type);
if (error != noErr) return ERROR;
/* Resource fork */
if (header.rsrcLength)
{
OpenRF(name, 0, &refNum);
for (i = 0; i < (header.rsrcLength - BLOCKSIZE); i += BLOCKSIZE)
{
BufferRead(gBufferPtr, buffer, BLOCKSIZE);
FSWrite(refNum, &count, buffer);
}
bytesLeft = header.rsrcLength - i;
if (bytesLeft > 0)
{
BufferRead(gBufferPtr, buffer, BLOCKSIZE);
FSWrite(refNum, &bytesLeft, buffer);
}
FSClose(refNum);
}
/* Data fork */
if (header.dataLength)
{
FSOpen(name, 0, &refNum);
for (i = 0; i < (header.dataLength - BLOCKSIZE); i += BLOCKSIZE)
{
BufferRead(gBufferPtr, buffer, BLOCKSIZE);
FSWrite(refNum, &count, buffer);
}
bytesLeft = header.dataLength - i;
if (bytesLeft > 0)
{
BufferRead(gBufferPtr, buffer, BLOCKSIZE);
FSWrite(refNum, &bytesLeft, buffer);
}
FSClose(refNum);
}
return OK;
}
short ListFile(void)
{
HEADER header; /* file header */
short refNum; /* file path reference number */
char buffer[BLOCKSIZE]; /* data buffer */
long i; /* counter */
long bytesLeft; /* number of bytes in last block */
long count = BLOCKSIZE; /* number of bytes read */
OSErr error; /* eror return */
/* read header */
if (BufferRead(gBufferPtr, buffer, BLOCKSIZE) == ERROR) return ERROR;
memcpy(&header, buffer, sizeof(header));
/* check checksum */
if (Checksum(&header, sizeof(header) - sizeof(header.checksum)) != header.checksum)
return ERROR;
if (header.checksum == 0) return FILE_END;
printf("%s\n",PtoCstr(header.name));
/* now read data */
/* Resource fork */
for (i = 0; i < (header.rsrcLength - BLOCKSIZE); i += BLOCKSIZE)
{
BufferRead(gBufferPtr, buffer, BLOCKSIZE);
}
bytesLeft = header.rsrcLength - i;
if (bytesLeft > 0)
{
BufferRead(gBufferPtr, buffer, BLOCKSIZE);
}
/* Data fork */
for (i = 0; i < (header.dataLength - BLOCKSIZE); i += BLOCKSIZE)
{
BufferRead(gBufferPtr, buffer, BLOCKSIZE);
}
bytesLeft = header.dataLength - i;
if (bytesLeft > 0)
{
BufferRead(gBufferPtr, buffer, BLOCKSIZE);
}
return OK;
}
long Checksum(void *bufferPtr, long count)
{
long i;
long sum = 0;
char *ptr;
ptr = (char *)bufferPtr;
for (i = 0; i < count; i++)
{
sum += *ptr;
ptr++;
}
return sum;
}